﻿#!/usr/bin/python3
# Aljaz Blatnik
# v2.0 junij 2021

import sys
import glob
import serial
import math
import random
import time
import tkinter as tk
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from tkinter import *
from tkinter import ttk
from tkinter import filedialog
from threading import Thread
import numpy as np
matplotlib.use("TkAgg")

###################################################
#               GLOBAL VARIABLES                  #
###################################################
# global variables
x_axis = [x * 0 for x in range(3601)]
y_axis = [0 for x in range(3601)]
y_axis_lin = [0 for x in range(3601)]
y_axis_temp = [0 for x in range(3601)]
# measure parameters global variables
maximum = 0.0
angle_maximum = 0
angle_maximum_1 = 0
angle_maximum_2 = 0
D = 1
# measure status
measure_status = 0 #0 - idle, 1 - measuring, 2 - stop, 3 - return

###################################################
# Graphical user interface using Tk and ttk       #
###################################################
window = Tk()
window.resizable(0, 0)
window.title("Antenska merilnica")

# Communication frame layout
COMSetupFrame = LabelFrame(window, text="1. Nastavi komunikacijo", height="200", width="200")
COMSetupFrame.grid(column=0,row=0,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=4,pady=4,sticky="nw")
RotatorLabel = Label(COMSetupFrame,text="Vrtiljak:")
RotatorLabel.grid(column=0,row=0,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=2,pady=2,sticky="e")
RotatorCOMCombobox = ttk.Combobox(COMSetupFrame,justify="center",width=10)
RotatorCOMCombobox.grid(column=1,row=0,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=2,pady=2,sticky="w")
ReceiverLabel = Label(COMSetupFrame,text="Sprejemnik:")
ReceiverLabel.grid(column=0,row=1,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=2,pady=2,sticky="e")
ReceiverCOMCombobox= ttk.Combobox(COMSetupFrame,justify="center",width=10)
ReceiverCOMCombobox.grid(column=1,row=1,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=2,pady=2,sticky="w")
ReceiverTypeLabelLabel = Label(COMSetupFrame,text="Tip: Sprejemnik ni znan!")
ReceiverTypeLabelLabel.grid(column=0,row=2,columnspan=2,rowspan=1,ipadx=0,ipady=0,padx=2,pady=2,sticky="w")
StatusTextBox = Text(COMSetupFrame,height=20,width=24)
StatusTextBox.grid(column=0,row=3,columnspan=4,rowspan=1,ipadx=0,ipady=0,padx=4,pady=4,sticky="w")

# Graphics frame layout
GraphicFrame = LabelFrame(window, text="Grafični Predogled", height="400", width="800")
GraphicFrame.grid(column=1,row=0,columnspan=1,rowspan=3,ipadx=0,ipady=0,padx=4,pady=4)

# Measurement setup frame layout
MeasurementSetupFrame = LabelFrame(window, text="2. Izvedi meritev", height="200", width="200")
MeasurementSetupFrame.grid(column=0,row=1,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=4,pady=4,sticky="w")
MeasureButton = tk.Button(MeasurementSetupFrame,text="Prični meritev",width=27,bg="#26dd1e")
MeasureButton.grid(column=0,row=0,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=3,pady=4,sticky="w")
StatusProgressBar = ttk.Progressbar(MeasurementSetupFrame,length=197)
StatusProgressBar.grid(column=0,row=1,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=4,pady=4)

# Export frame layout
ExportFrame = LabelFrame(window, text="3. Shrani meritev", height="200", width="200")
ExportFrame.grid(column=0,row=2,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=4,pady=4,sticky="sw")
TitleLabel = Label(ExportFrame,text="Naslov:")
TitleLabel.grid(column=0,row=0,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=2,pady=2,sticky="w")
TitleEntry = Entry(ExportFrame,justify="left",width=23)
TitleEntry.grid(column=0,row=0,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=4,pady=2,sticky="e")
#TitleEntry.insert(0, "Nova meritev")
ChartTypeCombobox = ttk.Combobox(ExportFrame,justify="center",height=4,width=29,values=['Kartezično - logaritemski', 'Kartezično - linearni', 'Polarno - logaritemski', 'Polarno - linearni'])
ChartTypeCombobox.grid(column=0,row=1,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=4,pady=4)
ChartTypeCombobox.current(0)
GenerateGraphButton = ttk.Button(ExportFrame,text="Generiraj graf",width=14,state="disabled")
GenerateGraphButton.grid(column=0,row=2,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=4,pady=4,sticky="w")
GenerateCSVButton = ttk.Button(ExportFrame,text="Generiraj CSV",width=14,state="disabled")
GenerateCSVButton.grid(column=0,row=2,columnspan=1,rowspan=1,ipadx=0,ipady=0,padx=4,pady=4,sticky="e")

# graph area
fig = plt.figure(figsize=(6,6), dpi=100)
canvas = FigureCanvasTkAgg(fig, GraphicFrame)
canvas.get_tk_widget().grid(column=0,row=0,columnspan=1,rowspan=1,ipadx=4,ipady=4,padx=4,pady=4)
canvas.draw()
axes = fig.add_subplot(111)

x1=[]
y1=[]
x2=[]
y2=[]
x3=[]
y3=[]
x4=[]
y4=[]
xx=[]
yy=[]
i=0
while i<=3600:
    s=math.sin(math.radians(i*0.1))
    c=math.cos(math.radians(i*0.1))
    x1=x1+[s/4]
    y1=y1+[c/4]
    x2=x2+[s/2]
    y2=y2+[c/2]
    x3=x3+[3*s/4]
    y3=y3+[3*c/4]
    x4=x4+[s]
    y4=y4+[c]
    #a=y_axis_temp[i]
    #xx=xx+[a*s]
    #yy=yy+[-a*c]
    i=i+1

l=0.2
axes.plot(x1,y1,'b-',lw=l)
axes.plot(x2,y2,'b-',lw=l)
axes.plot(x3,y3,'b-',lw=l)
axes.plot(x4,y4,'b-',lw=l)
k=0
while k<360:
    xk=math.sin(math.radians(k))*0.25
    yk=math.cos(math.radians(k))*0.25
    axes.plot([0.0,xk],[0.0,yk],'b-',lw=l)
    k=k+30
k=0
while k<360:
    xz=math.sin(math.radians(k))*0.25
    yz=math.cos(math.radians(k))*0.25
    xk=math.sin(math.radians(k))*0.5
    yk=math.cos(math.radians(k))*0.5
    axes.plot([xz,xk],[yz,yk],'b-',lw=l)
    k=k+15
k=0
while k<360:
    xz=math.sin(math.radians(k))*0.5
    yz=math.cos(math.radians(k))*0.5
    xk=math.sin(math.radians(k))
    yk=math.cos(math.radians(k))
    axes.plot([xz,xk],[yz,yk],'b-',lw=l)
    k=k+5
r=1.03
#axes.plot([0.0,math.sin(math.radians(angle_maximum))*r],[0.0,-math.cos(math.radians(angle_maximum))*r],'y-')
#axes.plot([0.0,math.sin(math.radians(angle_maximum_1))*r],[0.0,-math.cos(math.radians(angle_maximum_1))*r],'r-')
#axes.plot([0.0,math.sin(math.radians(angle_maximum_2))*r],[0.0,-math.cos(math.radians(angle_maximum_2))*r],'r-')

#axes.plot(xx,yy,'b-')
axes.set_xlim(-1.05,1.05)
axes.set_ylim(-1.05,1.05)
axes.set_xticks([])
axes.set_yticks([])

#axes.set_ylabel('Linearno radialno merilo za jakost (amplituda)')
axes.set_xlabel("Polarni prikaz - linearna amplituda")
axes.set_title("Radarska odmevna povrsina")
axes.set_aspect('equal')

line, = axes.plot(x_axis, y_axis, 'b-')     #main line

"""
axes = fig.add_subplot(111)
axes.set_xlim(0.0,360.0)
axes.set_ylim(-40.0,2.0)
axes.set_yticks([-40.0,-35.0,-30.0,-25.0,-20.0,-15.0,-10.0,-5.0,0.0])
axes.set_yticklabels(['-40 dB','-35 dB','-30 dB','-25 dB','-20 dB','-15 dB','-10 dB','-5 dB','0 dB'])
axes.set_xticks([0.0,45.0,90.0,135.0,180.0,225.0,270.0,315.0,360.0])
axes.set_xticklabels(['0°','45°','90°','135°','180°','225°','270°','315°','360°'])
axes.grid(True)
#axes.set_title(TitleEntry.get())
#axes.set_xlabel("Kot [°]")
line, = axes.plot(x_axis, y_axis, 'b-')     #main line
"""

###################################################
#                   FUNCTIONS                     #
###################################################
def popupMsg(msg):
    popup = tk.Tk()
    popup.wm_title("Opozorilo!")
    label = ttk.Label(popup, text=msg, justify="center")
    label.pack(fill=X, padx=10, pady=10)
    B1 = ttk.Button(popup, text="Ok", command = popup.destroy)
    B1.pack(padx=10, pady=10)
    popup.mainloop()

def serialPorts():
    if sys.platform.startswith('win'):
        ports = ['COM%s' % (i + 1) for i in range(256)]
    elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
        # this excludes current terminal "/dev/tty"
        ports = glob.glob('/dev/tty[A-Za-z]*')
    elif sys.platform.startswith('darwin'):
        ports = glob.glob('/dev/tty.*')
    else:
        raise EnvironmentError('Unsupported platform!')

    result = []
    for port in ports:
        try:
            s = serial.Serial(port)
            s.close()
            result.append(port)
        except (OSError, serial.SerialException):
            pass
    return result

def determineDevicesStartUp():
    str_info = "Iščem COM porte ... "
    StatusTextBox.insert(END, str_info)
    serial_ports_list = serialPorts()
    RotatorCOMCombobox['values'] = serial_ports_list
    ReceiverCOMCombobox['values'] = serial_ports_list
    str_info = "OK\n\r"
    StatusTextBox.insert(END, str_info)
    if(len(serial_ports_list) >= 1):
        str_info = "Določam naprave ... "
        StatusTextBox.insert(END, str_info)
        str_info = "OK\n\r"
        for idx, port in enumerate(serial_ports_list):
            try:
                str_device = ""
                str_version = ""
                s = serial.Serial(port,115200,timeout=1.0)
                s.flushInput()
                s.setRTS(False)	#release /BOOTLOADER
                s.setDTR(False)	#release /RESET
                str_device = s.readline().decode("utf-8")
                str_version = s.readline().decode("utf-8")
                str_info = str_info + port + ":(Neznana naprava)\n\r"
                if(str_device.startswith("Koracni vrtiljak")):
                    RotatorCOMCombobox.current(idx)
                    str_info = port + ":" + str_device + port + ": " + str_version
                if(str_device.startswith("LockInSprejemnik")):
                    ReceiverCOMCombobox.current(idx)
                    ReceiverTypeLabelLabel.configure(text="Tip: Lock-in sprejemnik (" + str_version.split(" ", 1)[0] + ")")
                    str_info = port + ": " + str_device + port + ": " + str_version
                s.close()
                StatusTextBox.insert(END, str_info)
                StatusTextBox.see(END)
                str_info = ""
            except:
                pass
    else:
        str_info = "Ni zaznanih naprav! Prikljucite naprave in znova pozenite program.\n\r"
        StatusTextBox.insert(END, str_info)

def measure(RotatorCOM, ReceiverCOM):
    global measure_status
    global y_axis_lin
    global maximum
    global angle_maximum
    global angle_maximum_1
    global angle_maximum_2
    global D
    measure_status = 1 # status = 1
    str_info = "Reset naprav ... "
    StatusTextBox.insert(END, str_info)
    StatusTextBox.see(END)
    MeasureButton['state'] = "disabled"
    # COM port setup, 115200bps, 8bit, no parity
    rx=serial.Serial(ReceiverCOM,115200,timeout=3.0)
    rx.setRTS(False)	#release /BOOTLOADER
    rx.setDTR(False)	#release /RESET
    vrt=serial.Serial(RotatorCOM,115200,timeout=3.0)
    vrt.setRTS(False)	#release /BOOTLOADER
    vrt.setDTR(False)	#release /RESET
    # wait for devices to boot
    rx.flushInput()
    vrt.flushInput()
    rx.read()           #wait to get first data - 3s max
    vrt.read()          #wait to get first data - 3s max
    # END COM setup
    str_info = "OK\n\r"
    StatusTextBox.insert(END, str_info)
    StatusTextBox.see(END)
    MeasureButton['state'] = "normal"
    MeasureButton['text'] = "Ustavi meritev"
    MeasureButton['bg'] = "#ff4343"
    MeasureButton.configure(command=measurementStop)

    # GUI
    str_info = "Pričenjam meritev\n\r"
    StatusTextBox.insert(END, str_info)
    StatusTextBox.see(END)
    GenerateGraphButton['state'] = "disabled"
    GenerateCSVButton['state'] = "disabled"
    StatusProgressBar['value'] = 0
    StatusProgressBar['maximum'] = 3600

    # variables reset
    i = 0
    maximum = 0.0
    angle_maximum = 0
    angle_maximum_1 = 0
    angle_maximum_2 = 0
    D = 1
    
    # START measurement
    vrt.flushInput()
    vrt.write(str.encode('5D'))	#rotate right speed 5
    while i<3600:
        if(measure_status == 2):
            vrt.write(str.encode('S'))	#stop
            while(measure_status != 3):
                pass
            vrt.write(str.encode('9L')) #return
            while(i!= 0.0): # wait to come back
                i = int(float(vrt.readline()[0:5])*10.0+0.5)
                StatusProgressBar['value'] = i
            rx.close()
            vrt.close()
            StatusProgressBar['value'] = 0
            status_str = 'OK\n\r'
            StatusTextBox.insert(END, status_str)
            StatusTextBox.see(END)
            MeasureButton['state'] = "normal"
            return
                
        s = vrt.readline()#read angle
        angle_read = float(s[0:5])
        rx.flushInput() #empty buffer
        rx.readline()   #empty first line
        s = rx.readline() #read data
        power = float(s[0:5])
        y_axis_lin[i] = math.pow(10.0,power*0.05)
        y_axis_temp[i] = power
        i=int(angle_read*10.0+0.5)
        #find maximum
        if(y_axis_lin[i] > maximum):
            #maximum = y_axis_lin[i]
            angle_maximum_1 = angle_read #maximum angle start
        if(y_axis_lin[i] == maximum):
            angle_maximum_2 = angle_read #maximum angle stop

        #live normalization - if slow remove this
        i_2 = 0
        while(i_2<=i):
            if(math.pow(10.0,power*0.05) > maximum):
                maximum = math.pow(10.0,power*0.05)
            s=math.sin(math.radians(i_2*0.1))
            c=math.cos(math.radians(i_2*0.1))
            x_axis[i_2] = (y_axis_lin[i_2]/maximum)*s
            y_axis[i_2] = -(y_axis_lin[i_2]/maximum)*c
            i_2 = i_2 + 1
        StatusProgressBar['value'] = i

    vrt.write(str.encode('9L')) #return with maximum speed
    while(i!= 0.0): # wait to come back
        i = int(float(vrt.readline()[0:5])*10.0+0.5)
        StatusProgressBar['value'] = i
    rx.close()
    vrt.close()
    StatusProgressBar['value'] = 0
    measurementReset()
    status_str = 'OK\n\r'
    StatusTextBox.insert(END, status_str)
    StatusTextBox.see(END)
    measure_status = 0
    MeasureButton['state'] = "normal"
    
    # convert to linear scale
    i = 0
    while i<=3600:
        y_axis_lin = y_axis_lin + [math.pow(10.0,y_axis[i]*0.05)]
        i=i+1
	
    # calculate grapf parameters
    # average maximum angle
    angle_maximum = ((angle_maximum_1 + angle_maximum_2) * 0.5)

    # integrate radiation pattern
    i = 1
    s = 0.0
    im = int(angle_maximum * 10 + 0.5)
    while i < 1800:
        i1 = im - i
        if i1 < 0:
            i1 = i1 + 3600
        i2 = im + i
        if i2 > 3600:
            i2 = i2 - 3600
        ff = math.pow(10.0,(y_axis[i1] * 0.1)) + math.pow(10.0,(y_axis[i2] * 0.1))
        s = s + ff * math.sin(math.radians(i * 0.1))
        i=i+1
    D = (7200/math.pi)/s	#calculate Directivity
    #dd='Smernost: %5.1f'%(D)+' = %5.2f'%(10*math.log(D,10))+' dBi'

    i = int(angle_maximum * 10 + 0.5)	#find -3dB border of a main bundle 
    while i >= 0:
        angle_maximum_1 = i * 0.1
        if y_axis[i] < -3.0:
            i = 0
        i = i - 1
    i=int(angle_maximum * 10 + 0.5)
    while i <= 3600:
        angle_maximum_2 = i * 0.1
        if y_axis[i] < -3.0:
            i = 3600
        i = i + 1
    #ss='Sirina -3dB: '+str(angle_maximum_2 - angle_maximum_1)

    # enable save buttons
    GenerateGraphButton['state'] = "enabled"
    GenerateCSVButton['state'] = "enabled"
    # status
    measure_status = 0

def measurementStart():
    # *********** visual UPDATE *********** #
    if((RotatorCOMCombobox.current()<0) or (ReceiverCOMCombobox.current()<0)):
        popupMsg("Določiti morate vse COM porte naprav!\n\rPred začetkom meritve, morate določiti COM porta vrtiljaka in sprejemnika. \nČe jih sistem ni našel samodejno, preverite ali so naprave priključene, nato znova zaženite program. \nČe sistem še vedno ne uspe samodejno prepoznati naprave, v meniju ročno izberite ustrezno serijsko vodilo.")
        return
    # *********** visual UPDATE *********** #
    thread1 = Thread(target = measure, args=(RotatorCOMCombobox.get(), ReceiverCOMCombobox.get(),))
    thread1.start()
    #thread2 = Thread(target = generateRandomGraph)
    #thread2.start()

def measurementReset():
    global measure_status
    measure_status = 3
    status_str = 'Ponastavljam ... '
    StatusTextBox.insert(END, status_str)
    StatusTextBox.see(END)
    MeasureButton['state'] = "disabled"
    MeasureButton['bg'] = "#26dd1e"
    MeasureButton['text'] = "Ponovi meritev"
    MeasureButton.configure(command=measurementStart)

def measurementStop():
    global measure_status
    measure_status = 2
    status_str = 'Meritev ustavljena!\n'
    StatusTextBox.insert(END, status_str)
    StatusTextBox.see(END)
    MeasureButton['text'] = "Ponastavi meritev"
    MeasureButton['bg'] = "#ffab4c"
    MeasureButton.configure(command=measurementReset)

def generateCSV():
    GenerateCSVButton['state'] = "disabled"
    t = time.ctime()  # time of measurement
    filename =  filedialog.asksaveasfilename(initialdir = "/",title = "Izberite datoteko", defaultextension = 'csv', filetypes = (("CSV","*.csv"),("vse","*.*")))
    if filename == "":
        GenerateCSVButton['state'] = "enabled"
        return
    status_str = "CSV: " + filename + "\n\r"
    StatusTextBox.insert(END, status_str)
    StatusTextBox.see(END)
    iz = open(filename,'w')
    iz.write(t + '\r\n') # first line time
    iz.write(TitleEntry.get() + '\r\n')	#second line title
    i = 0
    while i<=3600:
        iz.write('%05.1f'%(x_axis[i])+' '+'%05.2f'%(y_axis[i])+'\r\n')
        i=i+1
    iz.close()
    GenerateCSVButton['state'] = "enabled"

def generatePlot():
    status_str = "Pocakaj nalaganje ...\n\r"
    StatusTextBox.insert(END, status_str)
    StatusTextBox.see(END)
    j = ChartTypeCombobox.current() + 1 # get plot type 1=k.log, 2=k.lin, 3=p.log, 4=p.lin
    # string generation
    dd = "Smernost: %5.1f"%(D) + " = %5.2f"%(10*math.log(D,10)) + " dBi"
    ss = "Sirina -3dB: " + str(round((angle_maximum_2 - angle_maximum_1),2))
    om = "Odklon: " + str(round((angle_maximum - 180.0),2))
    if j>0 and j<5:
        fig1 = plt.figure()
        axes1 = fig1.add_subplot(111)
        if j==1 or j==2:
            axes1.plot([angle_maximum,angle_maximum],[-40.0,2.0],'y-')
            axes1.plot([angle_maximum_1,angle_maximum_1],[-40.0,2.0],'r-')
            axes1.plot([angle_maximum_2,angle_maximum_2],[-40.0,2.0],'r-')
            if j==1:
                axes1.plot(x_axis,y_axis,'b-')
                axes1.set_xlim(0.0,360.0)
                axes1.set_ylim(-40.0,2.0)
                axes1.set_yticks([-40.0,-35.0,-30.0,-25.0,-20.0,-15.0,-10.0,-5.0,0.0])
                axes1.set_ylabel('Relativna jakost sprejema v dB')
            else:
                x_axis_np = np.array(x_axis)
                y_axis_lin_np = np.array(y_axis_lin)
                axes1.plot(x_axis,y_axis_lin,'b-')
                axes1.set_xlim(0.0,360.0)
                axes1.set_ylim(0.0,1.05)
                axes1.set_yticks([0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0])
                axes1.set_ylabel('Jakost sprejema (amplituda) v linearnem merilu')
            axes1.set_xticks([0.0,45.0,90.0,135.0,180.0,225.0,270.0,315.0,360.0])
            axes1.grid(True)
            axes1.set_title(time.ctime() + '\n' + TitleEntry.get())
            axes1.set_xlabel(ss+'    '+om+'    '+dd)
            fig1.show()
        if j==3 or j==4:
            x1=[]
            y1=[]
            x2=[]
            y2=[]
            x3=[]
            y3=[]
            x4=[]
            y4=[]
            xx=[]
            yy=[]
            i=0
            while i<=3600:
                s=math.sin(math.radians(i*0.1))
                c=math.cos(math.radians(i*0.1))
                x1=x1+[s/4]
                y1=y1+[c/4]
                x2=x2+[s/2]
                y2=y2+[c/2]
                x3=x3+[3*s/4]
                y3=y3+[3*c/4]
                x4=x4+[s]
                y4=y4+[c]
                if j==3:
                    a=(y_axis[i]+40.0)/40.0
                    if a<0.0:
                        a=0.0
                else:
                    a=y_axis_lin[i]
                xx=xx+[a*s]
                yy=yy+[-a*c]
                i=i+1
            l=0.2
            axes1.plot(x1,y1,'g-',lw=l)
            axes1.plot(x2,y2,'g-',lw=l)
            axes1.plot(x3,y3,'g-',lw=l)
            axes1.plot(x4,y4,'g-',lw=l)
            k=0
            while k<360:
                xk=math.sin(math.radians(k))*0.25
                yk=math.cos(math.radians(k))*0.25
                axes1.plot([0.0,xk],[0.0,yk],'g-',lw=l)
                k=k+30
            k=0
            while k<360:
                xz=math.sin(math.radians(k))*0.25
                yz=math.cos(math.radians(k))*0.25
                xk=math.sin(math.radians(k))*0.5
                yk=math.cos(math.radians(k))*0.5
                axes1.plot([xz,xk],[yz,yk],'g-',lw=l)
                k=k+15
            k=0
            while k<360:
                xz=math.sin(math.radians(k))*0.5
                yz=math.cos(math.radians(k))*0.5
                xk=math.sin(math.radians(k))
                yk=math.cos(math.radians(k))
                axes1.plot([xz,xk],[yz,yk],'g-',lw=l)
                k=k+5
            r=1.03
            axes1.plot([0.0,math.sin(math.radians(angle_maximum))*r],[0.0,-math.cos(math.radians(angle_maximum))*r],'y-')
            axes1.plot([0.0,math.sin(math.radians(angle_maximum_1))*r],[0.0,-math.cos(math.radians(angle_maximum_1))*r],'r-')
            axes1.plot([0.0,math.sin(math.radians(angle_maximum_2))*r],[0.0,-math.cos(math.radians(angle_maximum_2))*r],'r-')

            axes1.plot(xx,yy,'b-')
            axes1.set_xlim(-1.05,1.05)
            axes1.set_ylim(-1.05,1.05)
            axes1.set_xticks([])
            axes1.set_yticks([])
            axes1.set_title(time.ctime() + '\n' + TitleEntry.get())
            axes1.set_xlabel(ss+'    '+om+'    '+dd)
            if j==3:
                axes1.set_ylabel('Logaritemsko radialno merilo (razpon 40dB)')
            else:
                axes1.set_ylabel('Linearno radialno merilo za jakost (amplituda)')
            axes1.set_aspect('equal')
            fig1.show()

def generateRandomGraph():
    global measure_status
    GenerateGraphButton['state'] = "disabled"
    GenerateCSVButton['state'] = "disabled"
    MeasureButton['text'] = "Ustavi meritev"
    MeasureButton['bg'] = "#ff4343"
    MeasureButton.configure(command=measurementStop)
    i = 0
    StatusProgressBar['value'] = 0
    StatusProgressBar['maximum'] = 3600
    while (i<3600):
        if(measure_status == 2):
            while(measure_status != 3):
                pass
            StatusProgressBar['value'] = 0
            return
        y_axis[i] = -30 #random.uniform(0.00, -40.00)
        time.sleep(0.0005)
        i = i + 1
        StatusProgressBar['value'] = i

    MeasureButton['bg'] = "#26dd1e"
    MeasureButton['text'] = "Ponovi meritev"
    MeasureButton.configure(command=measurementStart)
    GenerateGraphButton['state'] = "enabled"
    GenerateCSVButton['state'] = "enabled"

def plotInit():
    line.set_ydata(y_axis)
    line.set_xdata(x_axis)
    return line,

def animate(i):
    line.set_ydata(y_axis)
    line.set_xdata(x_axis)
    return line,
#################################################
# Graphic user interface - ACTION specification #
#################################################
MeasureButton.configure(command=measurementStart)
GenerateCSVButton.configure(command=generateCSV)
GenerateGraphButton.configure(command=generatePlot)
#################################################
# Graphic user interface - ACTION specification #
#################################################

ani = animation.FuncAnimation(fig, animate, init_func=plotInit, interval=10, blit=True)

window.wait_visibility() # wait GUI to load
thread3 = Thread(target = determineDevicesStartUp)
thread3.start()
window.mainloop()

#konec programa
